package Negocio;

import java.sql.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.logging.*;

/**
 *
 * @author Rodrigo Garcia Ortega
 */
public class Cita {
    private Integer ID;
    private Cliente cliente;
    private Tratamiento tratamiento;
    private Profesional profesional;
    private String estado;
    private String fecha;
    private String hora;
    private String comentarios;

    public Cita() {
    }

    /**
     * @return the ID
     */
    public Integer getID() {
        return ID;
    }

    /**
     * @param ID the ID to set
     */
    public void setID(Integer ID) {
        this.ID = ID;
    }

    /**
     * @return the cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the tratamiento
     */
    public Tratamiento getTratamiento() {
        return tratamiento;
    }

    /**
     * @return the profesional
     */
    public Profesional getProfesional() {
        return profesional;
    }

    /**
     * @param tratamiento the tratamiento to set
     */
    public void setTratamiento(Tratamiento tratamiento) {
        this.tratamiento = tratamiento;
    }

    /**
     * @param profesional the profesional to set
     */
    public void setProfesional(Profesional profesional) {
        this.profesional = profesional;
    }

    /**
     * @return the estado
     */
    public String getEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(String estado) {
        this.estado = estado;
    }

    /**
     * @return the fecha
     */
    public String getFecha() {
        return fecha;
    }

    /**
     * @param fecha the fecha to set
     */
    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    /**
     * @return the hora
     */
    public String getHora() {
        return hora;
    }

    /**
     * @param hora the hora to set
     */
    public void setHora(String hora) {
        this.hora = hora;
    }

    /**
     * @return the comentarios
     */
    public String getComentarios() {
        return comentarios;
    }

    /**
     * @param comentarios the comentarios to set
     */
    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }
    
    
    public Factura facturar()
    {
        Factura fac = new Factura();
        fac.setCita(this);
        fac.setCliente(cliente);
        fac.setTratamiento(tratamiento);
        fac.setEstado("Pendiente");
        String ref = fac.crearRef(fecha, ID);
        fac.setReferencia(ref);
        if(fac.guardar()){
            return fac;
        }
        return null;
    }
    
    public List<Cita> getAll(Connection conn){
       try
       {
           AdminDB adb = new AdminDB();
           Statement stmt = conn.createStatement();
           ResultSet rset = stmt.executeQuery("SELECT * FROM `bysDB`.`Cita` ORDER BY fecha,hora");
           
           List<Cita> citas = new ArrayList<Cita>();
                      
           while(rset.next()){
               Cita cita = new Cita();
               Cliente cli = new Cliente();
               Tratamiento t = new Tratamiento();
               Profesional p = new Profesional();
               cita.setID(rset.getInt("ID"));
               int idC = rset.getInt("Cliente_ID");
               int idT = rset.getInt("Tratamiento_ID");
               int idP = rset.getInt("Profesional_ID");
               cita.setEstado(rset.getString("estado"));
               cita.setFecha(adb.toDMY(rset.getString("fecha")));
               cita.setHora(rset.getString("hora").substring(0,5));
               cita.setComentarios(rset.getString("comentarios"));
               cli.getByID(adb.getConnection(), idC);
               cita.setCliente(cli);
               t.getbyID(adb.getConnection(), idT);
               cita.setTratamiento(t);
               p.getByID(adb.getConnection(), idP);
               cita.setProfesional(p);
               citas.add(cita);
           }
           if (rset !=null) rset.close();
           if (stmt != null) stmt.close();
           if (conn != null)conn.close();

           return citas;

        } catch (Exception e) {
            Logger.getLogger("AdjudicarCita").log(Level.SEVERE, "ERROR: " + e.getLocalizedMessage());
            return null;
        }
    }
    
    public List<Cita> getByCliente(Connection conn, int ID){
       try
       {
           AdminDB adb = new AdminDB();
           Statement stmt = conn.createStatement();
           ResultSet rset = stmt.executeQuery("SELECT * FROM `bysDB`.`Cita` WHERE Cliente_ID="+ID+" ORDER BY fecha,hora");
           
           List<Cita> citas = new ArrayList<Cita>();
                      
           while(rset.next()){
               Cita cita = new Cita();
               Cliente cli = new Cliente();
               Tratamiento t = new Tratamiento();
               Profesional p = new Profesional();
               cita.setID(rset.getInt("ID"));
               int idC = rset.getInt("Cliente_ID");
               int idT = rset.getInt("Tratamiento_ID");
               int idP = rset.getInt("Profesional_ID");
               cita.setEstado(rset.getString("estado"));
               cita.setFecha(adb.toDMY(rset.getString("fecha")));
               cita.setHora(rset.getString("hora").substring(0,5));
               cita.setComentarios(rset.getString("comentarios"));
               cli.getByID(adb.getConnection(), idC);
               cita.setCliente(cli);
               t.getbyID(adb.getConnection(), idT);
               cita.setTratamiento(t);
               p.getByID(adb.getConnection(), idP);
               cita.setProfesional(p);
               citas.add(cita);
           }
           if (rset !=null) rset.close();
           if (stmt != null) stmt.close();
           if (conn != null)conn.close();

           return citas;

        } catch (Exception e) {
            Logger.getLogger("AdjudicarCita").log(Level.SEVERE, "ERROR: " + e.getLocalizedMessage());
            return null;
        }
    }
    
    public void getByID(Connection conn, int ID){
       try
       {
           AdminDB adb = new AdminDB();
           Statement stmt = conn.createStatement();
           ResultSet rset = stmt.executeQuery("SELECT * FROM `bysDB`.`Cita` WHERE ID="+ID+";");
                      
           if(rset.next()){
               Cliente cli = new Cliente();
               Tratamiento t = new Tratamiento();
               Profesional p = new Profesional();
               this.ID = rset.getInt("ID");
               int idC = rset.getInt("Cliente_ID");
               int idT = rset.getInt("Tratamiento_ID");
               int idP = rset.getInt("Profesional_ID");
               this.estado = rset.getString("estado");
               this.fecha = adb.toDMY(rset.getString("fecha"));
               this.hora = rset.getString("hora").substring(0,5);
               this.comentarios = rset.getString("comentarios");
               cli.getByID(adb.getConnection(), idC);
               this.cliente = cli;
               t.getbyID(adb.getConnection(), idT);
               this.tratamiento = t;
               p.getByID(adb.getConnection(), idP);
               this.profesional = p;
           }
           if (rset !=null) rset.close();
           if (stmt != null) stmt.close();
           if (conn != null)conn.close();

        } catch (Exception e) {
            Logger.getLogger("PeticionCita").log(Level.SEVERE, "ERROR: " + e.getLocalizedMessage());
        }
    }

    public boolean guardar() {
        AdminDB adb = new AdminDB();
        ObjetoDB o = new ObjetoDB();
        
        o.setTabla("Cita");
        o.addCampo("Cliente_ID", String.valueOf(adb.getID("Cliente", "email='"+this.cliente.getEmail()+"'")));
        o.addCampo("Tratamiento_ID", String.valueOf(adb.getID("Tratamiento", "nombre='"+this.tratamiento.getNombre()+"'")));
        o.addCampo("Profesional_ID", String.valueOf(adb.getID("Profesional", "nombre='"+this.profesional.getNombre()+"'")));
        o.addCampo("estado", estado);
        o.addCampo("fecha", fecha);
        o.addCampo("hora", hora);
        o.addCampo("comentarios", comentarios);
        
        return adb.guardar(o);
    }
    
    public boolean borrar(){
        AdminDB adb = new AdminDB();
        
        ObjetoDB o = new ObjetoDB();
        o.setTabla("Cita");
        o.addCampo("ID", String.valueOf(ID)); 
        return adb.borrar(o);
    }
}
